package io.cattle.platform.core.dao.impl; import static io.cattle.platform.core.model.tables.StorageDriverTable.*; import static io.cattle.platform.core.model.tables.VolumeTable.*; import io.cattle.platform.core.constants.InstanceConstants; import io.cattle.platform.core.constants.StorageDriverConstants; import io.cattle.platform.core.constants.VolumeConstants; import io.cattle.platform.core.dao.GenericResourceDao; import io.cattle.platform.core.dao.StorageDriverDao; import io.cattle.platform.core.dao.VolumeDao; import io.cattle.platform.core.model.Instance; import io.cattle.platform.core.model.StorageDriver; import io.cattle.platform.core.model.Volume; import io.cattle.platform.db.jooq.dao.impl.AbstractJooqDao; import io.cattle.platform.json.JsonMapper; import io.cattle.platform.object.ObjectManager; import io.cattle.platform.object.util.DataAccessor; import io.cattle.platform.util.type.CollectionUtils; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.ThreadLocalRandom; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.codec.binary.Hex; @Named public class StorageDriverDaoImpl extends AbstractJooqDao implements StorageDriverDao { @Inject ObjectManager objectManager; @Inject VolumeDao volumeDao; @Inject GenericResourceDao resourceDao; @Inject JsonMapper jsonMapper; @Override public StorageDriver findSecretsDriver(long accountId) { for (StorageDriver driver : objectManager.find(StorageDriver.class, STORAGE_DRIVER.ACCOUNT_ID, accountId, STORAGE_DRIVER.REMOVED, null)) { List<String> caps = DataAccessor.fieldStringList(driver, StorageDriverConstants.FIELD_VOLUME_CAPABILITES); if (caps != null && caps.contains(StorageDriverConstants.CAPABILITY_SECRETS)) { return driver; } } return null; } @Override public Volume createSecretsVolume(Instance instance, StorageDriver storageDriver, String token) { Map<String, Object> dataVolumesMounts = DataAccessor.fieldMap(instance, InstanceConstants.FIELD_DATA_VOLUME_MOUNTS); Object volumeId = dataVolumesMounts.get(VolumeConstants.SECRETS_PATH); if (volumeId != null) { return objectManager.loadResource(Volume.class, volumeId.toString()); } byte[] bytes = new byte[32]; ThreadLocalRandom.current().nextBytes(bytes); String name = Hex.encodeHexString(bytes); Map<String, Object> tokenMap = CollectionUtils.asMap("value", token); Volume volume; try { volume = resourceDao.create(Volume.class, VOLUME.NAME, name, VOLUME.ACCOUNT_ID, instance.getAccountId(), VOLUME.STORAGE_DRIVER_ID, storageDriver.getId(), VolumeConstants.FIELD_VOLUME_DRIVER, storageDriver.getName(), VolumeConstants.FIELD_VOLUME_DRIVER_OPTS, CollectionUtils.asMap( VolumeConstants.SECRETS_OPT_KEY, jsonMapper.writeValueAsString(tokenMap))); } catch (IOException e) { throw new IllegalStateException(e); } dataVolumesMounts.put(VolumeConstants.SECRETS_PATH, volume.getId()); objectManager.setFields(instance, InstanceConstants.FIELD_DATA_VOLUME_MOUNTS, dataVolumesMounts); return volume; } }